In [10]:
Last Updated: 2024-02-25
  Cell In[10], line 1
    Last Updated: 2024-02-25
                       ^
SyntaxError: leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers

Notes on trading earnings releases with calendar spreads [in progress...]¶

Clone from:

Earnings releases for US listed companies are quarterly. Currently, I pick dates here from NASDAQ.

An intuitive strategy is to buy a long straddle prior to the announcement, therefore longing the volatility speculating on a large swing in either direction and loose if volatility remained small. Here, I analyze a calendar spread, concretely shorting near term volatility and longing far tenor. The shorted, elevated near implied volatility pay for the long far hedges.

In [1]:
import sys
sys.path.append('..')
from connector.quantconnect.volatility.earnings_release import *

I usually code in PyCharm, not Jupyter. That's why rather just importing much here, detailed code is in the repo.

Config¶
In [2]:
sym = 'MRNA'
equity = Equity(sym)
resolution = Resolution.second
seq_ret_threshold = 0.005

rate = DiscountRateMarket
dividend = dividend_yield = DividendYield[sym.upper()]
net_yield = rate - dividend_yield
marker_size = 4

# release_date = EarningsPreSessionDates(sym)[0]
release_date = EarningsPreSessionDates(sym)[-1]
ETL¶

The raw data originates from snapping equity and option quotes every time the underlying's price series has moved by >= 0.5%.

In [3]:
option_frame = OptionFrame.load_frame(equity, resolution, seq_ret_threshold, '1')
df = option_frame.df_options
df_equity = option_frame.df_equity
In [4]:
ts = df.index.get_level_values('ts').unique()
v_ts_pre_release = [i for i in ts if i.date() <= release_date]
v_ts_post_release = [i for i in ts if i.date() == release_date + datetime.timedelta(days=1)]

ts_pre_release = v_ts_pre_release[-1]
if v_ts_post_release:
    ts_post_release = v_ts_post_release[-1]

df0 = df.loc[v_ts_pre_release]
if v_ts_post_release:
    df1 = df.loc[v_ts_post_release]

expiries = list(sorted(set(df0.index.get_level_values('expiry').values)))

expiry_strike_pairs = list(sorted(set(zip(df0[df0['mid_iv'] != 0].index.get_level_values('expiry').values, df0[df0['mid_iv'] != 0].index.get_level_values('strike').values))))
expiry_strike_pairs_str = '\n'.join([f'{t[0].isoformat()} | {float(t[1])}' for t in expiry_strike_pairs])
# print(f'''Expiry | strike pairs\n: {expiry_strike_pairs_str}''')

s0 = df0.loc[ts_pre_release].iloc[0]['spot']
s1 = df1.loc[ts_post_release].iloc[0]['spot'] if v_ts_post_release else np.nan
dS_actual = s1 / s0 - 1
print(f'''Spot0: {s0}; Spot1: {s1}; dS: {round(s1-s0, 1)} | {round(100*(s1/s0-1), 1)} %''')

calcDate0 = ts_pre_release.date()
calcDate1 = calcDate0 + datetime.timedelta(days=1)
calcDates = [calcDate0, calcDate1]

exp_jump1 = sorted([i for i in expiries if i >= release_date])[0]
exp_jump2 = sorted([i for i in expiries if i >= release_date])[1]
exp_jumps = [exp_jump1, exp_jump2]

expiries_df = list(sorted(set(df.index.get_level_values('expiry').values)))
previous_non_jump_expiry = sorted([i for i in expiries_df if i < exp_jump1])[-1]
ts_pre_releaseTm7 = [i for i in ts if i.date() == previous_non_jump_expiry - datetime.timedelta(days=7)]  # 7 days to avoid typical ramp of expiring options
ts_pre_releaseTm7 = ts_pre_releaseTm7[-1] if ts_pre_releaseTm7 else df.index.get_level_values('ts')[5]
dfm7 = df.loc[ts_pre_releaseTm7]
sm7 = dfm7.iloc[0]['spot']

# estimated_diffusion_iv   No feasible way estimating this diffusion way for later expiries. For csco, later expiries ATM IV fell significantly even below long term IV levels.
# So now, just check plot this time atm iv over term and last release's one, then pick minimum tenor to use for hedging...
diffusion_iv = atm_iv(dfm7, previous_non_jump_expiry, sm7)   # 7 days is already elevated. not jump iv!
print(f'{sym.upper()} Diffusion IV: {diffusion_iv}')
Spot0: 86.8; Spot1: nan; dS: nan | nan %
MRNA Diffusion IV: 0.5237200168295723

Analysis¶

Price series¶
In [5]:
figSpot = go.Figure(go.Scatter(x=df0.index.get_level_values('ts'), y=df0['spot'], mode='lines', name='Spot'))
figSpot.update_layout(title=f'{sym} Spot', xaxis_title='Time', yaxis_title='Spot')
show(figSpot, f'{sym}_{release_date.strftime("%y%m%d")}_spot.html')
Implied Volatility Profile¶
In [6]:
# Analysing IVs meant for hedging
# plot_dates = expiries  # release_date + datetime.timedelta(days=i) for i in [0, 30, 60, 90, 120, 150, 180, 270, 365, 500]]
# figIvOverTime = make_subplots(rows=len(plot_dates), cols=1, subplot_titles=[dt.isoformat() for dt in plot_dates])
# for i, dt in enumerate(plot_dates):
#     df_mny1_tenor_dt = iv_at_date_over_time(df, dt, 1)
#     for right, _df in df_mny1_tenor_dt.groupby('right'):
#         # release_date_iv = _df[(_df['iv']!=0) & (_df['ts'].dt.date == release_date)]['iv'].mean()
#         # pre_release_date_iv = _df[(_df['iv']!=0) & (_df['ts'].dt.date < release_date)]['iv'].mean()
#         # print(f'IV at {dt} | {right} | release: {release_date_iv} | pre_release: {pre_release_date_iv}')
#         figIvOverTime.add_trace(go.Scatter(x=_df['ts'], y=_df['iv'], mode='lines', name=f'{right}-theo.expiry: {dt}'), row=i+1, col=1)
# figSpot.update_layout(title=f'{sym} IV over Time', xaxis_title='Time', yaxis_title='IV by expiry')
# show(figIvOverTime, 'iv_over_time.html')
Risk of Straddles¶
Building a calendar spread¶
In [7]:
option_universe = []
for expiry, strike in expiry_strike_pairs:
    for right in ('call', 'put'):
        try:
            option_universe.append(Option(OptionContract('', sym, expiry, Decimal(strike), right), ts_pre_release.date(), s0, val_from_df(df0.loc[ts_pre_release], expiry, Decimal(strike), right, 'mid_iv')))
        except KeyError:
            pass
print(f'Added {len(option_universe)} options to universe')
Added 1174 options to universe
In [8]:
# Stress test the portfolio params
v_dS = np.linspace(0.8, 1.2, 41)
v_dSpct = [100 * (dS - 1) for dS in v_dS]

# Bug in whole simulation. There's a level shift, but also movement across smile. Need to separate these.
level_iv_move = 0
skew = -0.01
sticky_delta_factor = 1

# Initialize portfolio of near short options
strikes = pd.Series(np.unique(df0.loc[(ts_pre_release, exp_jump1, slice(None), slice(None))].index.get_level_values('strike').astype(float)))
strikes_atm = strikes.iloc[(strikes - s0).abs().sort_values().head(2).index].values

print(f'ATM strike: {strikes_atm}')
pf_short = defaultdict(int, {
    Option(OptionContract('', sym, exp_jump1, Decimal(strikes_atm[0]), 'call'), calcDate0, 0, 0): -1,
    Option(OptionContract('', sym, exp_jump1, Decimal(strikes_atm[0]), 'put'), calcDate0, 0, 0): -1,
    Option(OptionContract('', sym, exp_jump1, Decimal(strikes_atm[1]), 'call'), calcDate0, 0, 0): -1,
    Option(OptionContract('', sym, exp_jump1, Decimal(strikes_atm[1]), 'put'), calcDate0, 0, 0): -1,
})
pf = defaultdict(int, {**pf_short})

# Plot PL of short option pf only
v_dPL_pf_short = [stress_pf(pf_short, s0, dS, calcDate0, calcDate1, exp_jumps, diffusion_iv, df_reality=df0.loc[ts_pre_release]) for dS in v_dS]

# Actual dPL PF Short
if v_ts_post_release:
    v_dSpct_pf_actual = [100 * (s1/s0 - 1) for s1 in df1[~df1.index.get_level_values('ts').duplicated()]['spot'].values]
    v_dPL_pf_short_actual = [simulate_pf_pnl(pf_short, df0.loc[ts_pre_release], df1.loc[ts]) for ts in v_ts_post_release]

# Shorting near term vola. No far term hedges
fig_short_only = make_subplots(rows=1, cols=1)
fig_short_only.add_trace(go.Scatter(x=v_dSpct, y=v_dPL_pf_short, mode='markers', name=f'dS dPL PF Short Stressed', marker=dict(size=marker_size)), row=1, col=1)
if v_ts_post_release:
    fig_short_only.add_trace(go.Scatter(x=v_dSpct_pf_actual, y=v_dPL_pf_short_actual, mode='markers', name=f'dS dPL PF Short Actual', marker=dict(size=marker_size)), row=1, col=1)
show(fig_short_only, f'''{sym}_{release_date.strftime('%y%m%d')}_fig_short_only.html''')
ATM strike: [87. 86.]
Risk of far tenor¶
In [9]:
 # Selecting hedges
current_risk = 0
figures = []
for i in range(20):
    print(f'Iteration: {i}')
    ranked_hedges_dct = rank_hedges(pf, option_universe, s0, calcDate0, calcDate1, exp_jumps, diffusion_iv, df0.loc[ts_pre_release])
    # ranked_hedges_dct = rank_hedges(pf, option_universe, s0, calcDate1, diffusion_iv)
    # print(f'Ranked hedges: {ranked_hedges_dct}')
    best_hedge = max(ranked_hedges_dct, key=ranked_hedges_dct.get)
    print(f'Best hedge: {best_hedge}: {ranked_hedges_dct[best_hedge]}')
    if ranked_hedges_dct[best_hedge] <= 0:
        print(f'No more useful hedges. Exiting.')
        break
    pf[best_hedge] += 1

    deltaTotalPf0Total = deltaTotalPf(pf, s0, calcDate0, df0.loc[ts_pre_release])
    # pf[Equity(sym)] = -int(deltaTotalPf0Total)
    print(f'Portfolio Equity Position: {pf[Equity(sym)]}')

    # Stress testing short long pf
    v_dPL_pf = [stress_pf(pf, s0, dS, calcDate0, calcDate1, exp_jumps, diffusion_iv, df_reality=df0.loc[ts_pre_release], dIVlevel=0) for dS in v_dS]
    if v_ts_post_release:
        v_dPL_pf_actual = [simulate_pf_pnl(pf, df0.loc[ts_pre_release], df1.loc[ts]) for ts in v_ts_post_release]

    # Instead of using pf delta at eod, regress the scenario PLs and pick best delta...

    figdSdIV = make_subplots(rows=2, cols=1)

    figdSdIV.add_trace(go.Scatter(x=v_dSpct, y=v_dPL_pf, mode='markers', name=f'dPL_pf', marker=dict(size=marker_size)), row=1, col=1)
    if v_ts_post_release:
        figdSdIV.add_trace(go.Scatter(x=v_dSpct_pf_actual, y=v_dPL_pf_actual, mode='markers', name=f'v_dPL_pf_actual', marker=dict(size=marker_size)), row=1, col=1)

    v_dIVlevel = np.linspace(-0.1, 0, 6)
    v_dPL = []
    for dIVlevel in v_dIVlevel:
        v_dIVdSdPL_pf = [stress_pf(pf, s0, dS, calcDate0, calcDate1, exp_jumps, diffusion_iv, dIVlevel=dIVlevel, df_reality=df0.loc[ts_pre_release]) for dS in v_dS]
        figdSdIV.add_trace(go.Scatter(x=v_dSpct, y=v_dIVdSdPL_pf, mode='markers', name=f'dIV: {dIVlevel}', marker=dict(size=marker_size)), row=2, col=1)
    figures.append(figdSdIV)

    print('Symbol,Quantity,FillPrice')
    for sec, q in pf.items():
        print(f'{str(sec)},{q},0')
    pass

    pf = defaultdict(int, {o: q for o, q in pf.items() if isinstance(o, Option) and q != 0})

# s = fig.write_html(f'figure.html')
for i in [0, len(figures)-1]:
    show(figures[i], f'''{sym}_{release_date.strftime('%y%m%d')}_figdSdIV_iteration_{i}.html''')

print(f'Done {sym}')
Iteration: 0
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240719C00120000: 81.35816708703233
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA,0,0
Iteration: 1
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240719P00075000: 97.12825585770162
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA  240719P00075000,1,0
MRNA,0,0
Iteration: 2
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240719C00115000: 81.4967162869838
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA  240719P00075000,1,0
MRNA  240719C00115000,1,0
MRNA,0,0
Iteration: 3
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240719P00080000: 93.69007766644046
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA  240719P00075000,1,0
MRNA  240719C00115000,1,0
MRNA  240719P00080000,1,0
MRNA,0,0
Iteration: 4
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240719C00125000: 88.93613146500093
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA  240719P00075000,1,0
MRNA  240719C00115000,1,0
MRNA  240719P00080000,1,0
MRNA  240719C00125000,1,0
MRNA,0,0
Iteration: 5
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240719P00065000: 43.14787697772891
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA  240719P00075000,1,0
MRNA  240719C00115000,1,0
MRNA  240719P00080000,1,0
MRNA  240719C00125000,1,0
MRNA  240719P00065000,1,0
MRNA,0,0
Iteration: 6
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240719C00130000: 69.45501746036564
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA  240719P00075000,1,0
MRNA  240719C00115000,1,0
MRNA  240719P00080000,1,0
MRNA  240719C00125000,1,0
MRNA  240719P00065000,1,0
MRNA  240719C00130000,1,0
MRNA,0,0
Iteration: 7
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240719P00070000: 41.204937275215116
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA  240719P00075000,1,0
MRNA  240719C00115000,1,0
MRNA  240719P00080000,1,0
MRNA  240719C00125000,1,0
MRNA  240719P00065000,1,0
MRNA  240719C00130000,1,0
MRNA  240719P00070000,1,0
MRNA,0,0
Iteration: 8
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240920C00130000: 71.85803855357176
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA  240719P00075000,1,0
MRNA  240719C00115000,1,0
MRNA  240719P00080000,1,0
MRNA  240719C00125000,1,0
MRNA  240719P00065000,1,0
MRNA  240719C00130000,1,0
MRNA  240719P00070000,1,0
MRNA  240920C00130000,1,0
MRNA,0,0
Iteration: 9
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240719P00060000: 38.66295501630714
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA  240719P00075000,1,0
MRNA  240719C00115000,1,0
MRNA  240719P00080000,1,0
MRNA  240719C00125000,1,0
MRNA  240719P00065000,1,0
MRNA  240719C00130000,1,0
MRNA  240719P00070000,1,0
MRNA  240920C00130000,1,0
MRNA  240719P00060000,1,0
MRNA,0,0
Iteration: 10
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240719C00140000: 29.2855266160376
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA  240719P00075000,1,0
MRNA  240719C00115000,1,0
MRNA  240719P00080000,1,0
MRNA  240719C00125000,1,0
MRNA  240719P00065000,1,0
MRNA  240719C00130000,1,0
MRNA  240719P00070000,1,0
MRNA  240920C00130000,1,0
MRNA  240719P00060000,1,0
MRNA  240719C00140000,1,0
MRNA,0,0
Iteration: 11
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240920P00060000: 33.95965816844296
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA  240719P00075000,1,0
MRNA  240719C00115000,1,0
MRNA  240719P00080000,1,0
MRNA  240719C00125000,1,0
MRNA  240719P00065000,1,0
MRNA  240719C00130000,1,0
MRNA  240719P00070000,1,0
MRNA  240920C00130000,1,0
MRNA  240719P00060000,1,0
MRNA  240719C00140000,1,0
MRNA  240920P00060000,1,0
MRNA,0,0
Iteration: 12
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240719C00145000: 26.18073811209115
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA  240719P00075000,1,0
MRNA  240719C00115000,1,0
MRNA  240719P00080000,1,0
MRNA  240719C00125000,1,0
MRNA  240719P00065000,1,0
MRNA  240719C00130000,1,0
MRNA  240719P00070000,1,0
MRNA  240920C00130000,1,0
MRNA  240719P00060000,1,0
MRNA  240719C00140000,1,0
MRNA  240920P00060000,1,0
MRNA  240719C00145000,1,0
MRNA,0,0
Iteration: 13
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240719P00055000: 19.34783537871965
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA  240719P00075000,1,0
MRNA  240719C00115000,1,0
MRNA  240719P00080000,1,0
MRNA  240719C00125000,1,0
MRNA  240719P00065000,1,0
MRNA  240719C00130000,1,0
MRNA  240719P00070000,1,0
MRNA  240920C00130000,1,0
MRNA  240719P00060000,1,0
MRNA  240719C00140000,1,0
MRNA  240920P00060000,1,0
MRNA  240719C00145000,1,0
MRNA  240719P00055000,1,0
MRNA,0,0
Iteration: 14
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240719C00150000: 14.52050075555826
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA  240719P00075000,1,0
MRNA  240719C00115000,1,0
MRNA  240719P00080000,1,0
MRNA  240719C00125000,1,0
MRNA  240719P00065000,1,0
MRNA  240719C00130000,1,0
MRNA  240719P00070000,1,0
MRNA  240920C00130000,1,0
MRNA  240719P00060000,1,0
MRNA  240719C00140000,1,0
MRNA  240920P00060000,1,0
MRNA  240719C00145000,1,0
MRNA  240719P00055000,1,0
MRNA  240719C00150000,1,0
MRNA,0,0
Iteration: 15
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240920P00055000: 14.568867647304728
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA  240719P00075000,1,0
MRNA  240719C00115000,1,0
MRNA  240719P00080000,1,0
MRNA  240719C00125000,1,0
MRNA  240719P00065000,1,0
MRNA  240719C00130000,1,0
MRNA  240719P00070000,1,0
MRNA  240920C00130000,1,0
MRNA  240719P00060000,1,0
MRNA  240719C00140000,1,0
MRNA  240920P00060000,1,0
MRNA  240719C00145000,1,0
MRNA  240719P00055000,1,0
MRNA  240719C00150000,1,0
MRNA  240920P00055000,1,0
MRNA,0,0
Iteration: 16
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240719C00135000: 19.290953726383577
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA  240719P00075000,1,0
MRNA  240719C00115000,1,0
MRNA  240719P00080000,1,0
MRNA  240719C00125000,1,0
MRNA  240719P00065000,1,0
MRNA  240719C00130000,1,0
MRNA  240719P00070000,1,0
MRNA  240920C00130000,1,0
MRNA  240719P00060000,1,0
MRNA  240719C00140000,1,0
MRNA  240920P00060000,1,0
MRNA  240719C00145000,1,0
MRNA  240719P00055000,1,0
MRNA  240719C00150000,1,0
MRNA  240920P00055000,1,0
MRNA  240719C00135000,1,0
MRNA,0,0
Iteration: 17
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240920P00070000: 20.870107479470676
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA  240719P00075000,1,0
MRNA  240719C00115000,1,0
MRNA  240719P00080000,1,0
MRNA  240719C00125000,1,0
MRNA  240719P00065000,1,0
MRNA  240719C00130000,1,0
MRNA  240719P00070000,1,0
MRNA  240920C00130000,1,0
MRNA  240719P00060000,1,0
MRNA  240719C00140000,1,0
MRNA  240920P00060000,1,0
MRNA  240719C00145000,1,0
MRNA  240719P00055000,1,0
MRNA  240719C00150000,1,0
MRNA  240920P00055000,1,0
MRNA  240719C00135000,1,0
MRNA  240920P00070000,1,0
MRNA,0,0
Iteration: 18
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240719C00110000: 30.303623255723323
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA  240719P00075000,1,0
MRNA  240719C00115000,1,0
MRNA  240719P00080000,1,0
MRNA  240719C00125000,1,0
MRNA  240719P00065000,1,0
MRNA  240719C00130000,1,0
MRNA  240719P00070000,1,0
MRNA  240920C00130000,1,0
MRNA  240719P00060000,1,0
MRNA  240719C00140000,1,0
MRNA  240920P00060000,1,0
MRNA  240719C00145000,1,0
MRNA  240719P00055000,1,0
MRNA  240719C00150000,1,0
MRNA  240920P00055000,1,0
MRNA  240719C00135000,1,0
MRNA  240920P00070000,1,0
MRNA  240719C00110000,1,0
MRNA,0,0
Iteration: 19
Implied jump: 0.037507584259396244; dS=3.255658313715594
Best hedge: MRNA  240719P00090000: 33.65884680644058
Portfolio Equity Position: 0
Symbol,Quantity,FillPrice
MRNA  240223C00087000,-1,0
MRNA  240223P00087000,-1,0
MRNA  240223C00086000,-1,0
MRNA  240223P00086000,-1,0
MRNA  240719C00120000,1,0
MRNA  240719P00075000,1,0
MRNA  240719C00115000,1,0
MRNA  240719P00080000,1,0
MRNA  240719C00125000,1,0
MRNA  240719P00065000,1,0
MRNA  240719C00130000,1,0
MRNA  240719P00070000,1,0
MRNA  240920C00130000,1,0
MRNA  240719P00060000,1,0
MRNA  240719C00140000,1,0
MRNA  240920P00060000,1,0
MRNA  240719C00145000,1,0
MRNA  240719P00055000,1,0
MRNA  240719C00150000,1,0
MRNA  240920P00055000,1,0
MRNA  240719C00135000,1,0
MRNA  240920P00070000,1,0
MRNA  240719C00110000,1,0
MRNA  240719P00090000,1,0
MRNA,0,0
Done MRNA
Trade entry¶
Trade exit¶

... to be continued

In [ ]: